package cn.tedu.store.service.impl;

import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.tedu.store.entity.Address;
import cn.tedu.store.entity.District;
import cn.tedu.store.mapper.AddressMapper;
import cn.tedu.store.service.IAddressService;
import cn.tedu.store.service.IDistrictService;
import cn.tedu.store.service.ex.AccessDeniedException;
import cn.tedu.store.service.ex.AddressCountException;
import cn.tedu.store.service.ex.AddressNotFoundException;
import cn.tedu.store.service.ex.DeleteException;
import cn.tedu.store.service.ex.InsertException;
import cn.tedu.store.service.ex.UpdateException;

@Service
public class AddressServiceImpl implements IAddressService {
	
	@Autowired
	private AddressMapper addressMapper;
	@Autowired
	private IDistrictService districtService;
	@Value("${project.address.max-count}")
	private Integer addressMaxCount;
	
	@Override
	public void addnew(Integer uid, String username, Address address) {
		// 根据参数uid查询该用户的收货地址数量
		Integer count = addressMapper.countByUid(uid);
		// 判断该用户的收货地址数量是否已经达到上限：count >= 10
		if (count >= addressMaxCount) {
			// 是：抛出AddressCountException
			throw new AddressCountException(
				"您创建的收货地址数据的数量已经达到上限(" + addressMaxCount + ")");
		}
		
		// 补全数据：根据参数address中省/市/区的代码获取名称
		String provincecName = getDistrictName(address.getProvincecCode());
		String cityName = getDistrictName(address.getCityCode());
		String areaName = getDistrictName(address.getAreaCode());
		address.setProvincecName(provincecName);
		address.setCityName(cityName);
		address.setAreaName(areaName);

		// 判断查询到的收货地址数量是否为0，得到isDefault
		Integer isDefault = count == 0 ? 1 : 0;
		// 补全数据：uid
		address.setUid(uid);
		// 补全数据：isDefault
		address.setIsDefault(isDefault);

		// 创建当前时间对象
		Date now = new Date();
		// 补全数据：4个日志
		address.setCreatedUser(username);
		address.setCreatedTime(now);
		address.setModifiedUser(username);
		address.setModifiedTime(now);

		// 调用持久层对象插入数据，并获取返回值
		Integer rows = addressMapper.insert(address);
		// 判断受影响的行数是否不为1
		if (rows != 1) {
			// 是：抛出InsertException
			throw new InsertException(
				"插入收货地址数据时出现未知错误，请联系系统管理员");
		}
	}

	@Override
	public List<Address> getByUid(Integer uid) {
		List<Address> list = addressMapper.findByUid(uid);
		for (Address address : list) {
			address.setUid(null);
			address.setProvincecCode(null);
			address.setCityCode(null);
			address.setAreaCode(null);
			address.setCreatedUser(null);
			address.setCreatedTime(null);
			address.setModifiedUser(null);
			address.setModifiedTime(null);
		}
		return list;
	}
	
	@Override
	@Transactional
	public void setDefault(Integer aid, Integer uid, String username) {
		// 根据aid查询数据
		Address result = addressMapper.findByAid(aid);
		// 判断查询结果是否为null
		if (result == null) {
			// 是：AddressNotFoundException
			throw new AddressNotFoundException(
				"尝试访问的收货地址数据不存在");
		}

		// 检查归属是否正确
		// 判断查询结果中的uid与当前登录的用户uid(参数uid)是否不同
		if (!result.getUid().equals(uid)) {
			// 是：AccessDeniedException
			throw new AccessDeniedException("非法访问");
		}

		// 将该用户的所有地址设置为非默认，获取返回值
		Integer rows = addressMapper.updateNonDefaultByUid(uid);
		// 判断返回的受影响行数是否小于1
		if (rows < 1) {
			// 是：UpdateException
			throw new UpdateException(
				"更新收货地址数据时出现未知错误，请联系系统管理员[1]");
		}

		// 将指定地址设置为默认，获取返回值
		rows = addressMapper.updateDefaultByAid(aid, username, new Date());
		// 判断返回的受影响行数是否不为1
		if (rows != 1) {
			// 是：UpdateException
			throw new UpdateException(
				"更新收货地址数据时出现未知错误，请联系系统管理员[2]");
		}
	}
	
	/**
	 * 根据省/市/区的代号，获取省/市/区的名称 
	 * @param code 省/市/区的代号
	 * @return 匹配的省/市/区的名称，如果没有匹配的数据，则返回null
	 */
	private String getDistrictName(String code) {
		District district = districtService.getByCode(code);
		return district == null ? null : district.getName();
	}

	@Override
	public void delete(Integer aid, Integer uid, String username) {
		// 根据参数aid查询数据
		Address result = addressMapper.findByAid(aid);
	    // 判断查询结果是否为null
		if(result == null) {
			// 是：AddressNotFoundException
			throw new AddressNotFoundException();
		}
	    // 判断查询结果中的uid与参数uid是否不同
		if("uid".equals(result.getUid())) {
			// 是：AccessDeniedException
			throw new AccessDeniedException();
		}
	    // 根据参数aid执行删除，获取返回值
		Integer row1 = addressMapper.deleteByAid(aid);
	    // 判断返回值是否不为1
		if(!(row1.equals(1))) {
			// 是：DeleteException
			throw new DeleteException();
		}
	    

	    // 判断查询结果中的isDefault是否为0
		
	    // return;

	    // 通过countByUid(uid)统计还有多少收货地址
	    // 判断统计结果是否为0
	    // return;

	    // 通过findLastModifiedByUid(uid)找出最后修改的收货地址
	    // 取出这条收货地址的aid
	    // 通过updateDefaultByAid(aid, username, new Date())以上找到的收货地址设置为默认，获取返回值
	    // 判断返回值是否不为1
	    // 是：UpdateException
	}
	


}
